(Mathcad2000.bmp)

Mathcad 2000: первые впечатления

писал В.Очков http://twt.mpei.ac.ru/ochkov

подсказывали, что писать В.Дьяконов и К.Орлов

Кому: info@mathsoft.com

От кого: ochkov@twt.mpei.ac.ru

Тема: Mathcad 2000

Dear Mathsoft,
I received your letter and at once realised that it was from you. My first thought was that it wasn't from you, but as soon as I opened it, I understood at once that it was, and that I had only thought it wasn't. I am glad that you've created a new program, because when the firm creates a new program, it has achieved what it wanted. And I'm very glad that you've created a new program, because when a firm creates a new program, then it has achieved what it wanted. Yesterday I received your letter and thought at first that it was from you, then began worrying, "What if it's not from you?" but when I opened it I saw that it was from you after all. You've made my day by writing to me. At first you didn't write, and then suddenly you did, even though I hadn't heard from you for some time. Immediately I received your letter I decided that it must be from you, and I'm so very glad that you've already created a new program. And, if the firm wants to create a new program, it should by all means create a new program. Therefore I'm so glad that you've at last created that program, exactly as required. And it made my day that you wrote to me. I was highly delighted on seeing the letter and thinking at once that it was from you. To tell the truth, as I opened it, the idea crossed my mind that it wasn't from you, but nevertheless I soon decided that it was. Thank you for writing. I'm very glad for you. Maybe you don't guess why, but I'll explain straight away that I'm glad for you because you've created a new program, which was wanted. And, believe me, it's good to create that program, exactly as required, because then you achieve what you wanted. For this reason, I am so glad for you. And I'm also glad, too, that you've written a letter to me. I've decided for certain now that the letter is from you, even though when I picked it up I had the sudden thought that it might not be from you. And then I thought, "Surely, it must certainly be from you." As I unsealed the package, I was thinking, "Is it from you or not?" Happily, as I unpacked it I saw that it was. I was very delighted and also decided to write a letter to you. I've a lot to tell you, but there's literally no time. I had time (and was in time) to write this much in a letter to you, and I'll write more when there is time; now there's absolutely none, as I'm writing a piece for a Journal. It's good, at least, that you've written a letter to me. Now, I know that you created a new program a while back. I knew from your earlier letters when you created new programs, and now again I see, completely correctly, that you have created a new program. And I am very glad, that you have created a new program and written a letter to me. Immediately I saw your letter I decided that you must have created a new program again. Well, I think, it is good that you've created a new program and written a letter to me about it. It is possible I shall tell the readers of a Journal about it.

Дорогая фирма MathSoft,

получил ваше письмо и сразу понял, что оно от вас. Сначала подумал, что оно вдруг не от вас, но как только распечатал, сразу понял, что оно от вас, а то было подумал, что оно не от вас. Я рад, что вы создали новую программу, потому что когда фирма создает новую программу, то значит, что она добилась того, чего хотела. И я вот очень рад, что вы создали новую программу, потому что, когда фирма создает новую программу, то значит, она добилась того, чего хотела. Вчера я получил письмо и сразу подумал, что это оно от вас, но потом подумал, что кажется, что не от вас, но распечатал и вижу – точно от вас. Очень хорошо сделали, что написали мне. Сначала не писали, а потом вдруг написали, хотя еще раньше, до того, как некоторое время не писали – тоже писали. Я сразу, как получил ваше письмо, решил, что оно от вас, и, потому, я очень рад, что вы уже создали новую программу. А то, если фирма захочет создать новую программу, то ей надо во что бы то ни стало создать новую программу. Поэтому я очень рад, что вы наконец создали именно ту программу, какую хотели. И очень хорошо сделали, что написали мне. Я очень обрадовался, как увидел письмо, и сразу подумал, что оно от вас. Правда, когда распечатывал, то мелькнула мысль, что оно не от вас, но потом, все-таки, я решил, что оно от вас. Спасибо, что написали. Благодарю вас за это и очень рад за вас. Вы, может быть, не догадываетесь, почему я так рад за вас, но я вам сразу скажу, что рад я за вас потому, что вы создали новую программу, и именно ту, какую хотели. А это, знаете, очень хорошо создать именно ту программу, какую хотели, потому что тогда именно и добиваешься того, чего хотел. Вот именно поэтому я так рад за вас. А также рад и тому, что вы написали мне письмо. Я еще издали решил, что письмо от вас, а как взял в руки, так подумал: а вдруг не от вас? А потом думаю: да нет, конечно от вас. Сам распечатываю письмо и в то же время думаю: от вас или не от вас? Ну, а как распечатал, то и вижу, что от вас. Я очень обрадовался и решил тоже написать вам письмо. О многом надо сказать, но буквально нет времени. Что успел, написал вам в этом письме, а остальное потом напишу, а то сейчас совсем нет времени – пишу статью для журнала. Хорошо, по крайней мере, что вы написали мне письмо. Теперь я знаю, что вы уже давно создали новую программу. Я и из прежних писем знал, что вы создали новую программу, а теперь опять вижу – совершенно верно, вы создали новую программу. И я очень рад, что вы создали новую программу и написали мне письмо. Я сразу, как увидел ваше письмо, так и решил, что вы опять создали новую программу. Ну, думаю, это хорошо, что вы опять создали новую программу и написали мне об этом письмо. Можно я расскажу о вашей новой программе читателям журнала. Перевод R.Dirvin.

Эпиграф в стиле Даниила Хармса

(оригинал http://lib.ru/HARMS/harms.txt)

 

Это третья статья автора, посвященная разбору новых версий этой популярнейшей математической программы (см. “Mathcad 7 Pro: что нового?”, Компьютер Пресс, 8’97 и “Mathcad 8: что нового?”, 10’98). Как видит читатель, “шаблон” названия статей этой серии изменился. Автор после стольких лет плотного знакомства с Mathcad осмеливается не просто перечислять новые команды, операторы и функции, но и давать их критический разбор. Тем более, что многие замечания учитываются разработчиками Mathcad если в не данной, то в перспективных версиях: “Эту версию продаю, вторую отлаживаю, а о третьей думаю!”.

Новинки Mathcad 2000 условно можно разделить на три группы: качественные изменения (не было – появилось), количественные изменения (больше – меньше, медленно – быстро и т.д.) и “прибамбасы”. Эти три группы можно и нужно рассматривать как некие нечеткие пересекающиеся множества, о которых автор писал в статье “Mathcad и теория нечетких множеств” (8’98).

Булевы операторы

Пользователи Mathcad, особенно те, кто составлял программы на его встроенном языке, с удивлением обнаруживали, что в среде Mathcad нет традиционных булевых операторов и функций. Это тем более странно, если принять во внимание, что вся машинная математика – это “жонглирование” нулями и единицами, то есть простейшие булевы операции над булевыми переменными.

Проблему функций And, Or и др. пользователи Mathcad решали разными путями, заменяя, например, логическое И (And) на арифметическое умножение (1.1=1, 0.1=0, 1.0=0 и 0.0=0), а логическое ИЛИ (Or) – на сложение (1+1=2 (? 0), 1+0=1, 0+1=1 и 0+0=0). Другой выход из положения: ввод в расчет пользовательских функций Not(x) := if(x, 0, 1), And(x, y) := if(x ?  y, 1, 0) и Or(x, y) := if(x + y, 1 ,0) и т.д. Попытка анализа этой проблемы предпринята автором в статье “Mathcad и нечеткая булева алгебра” (1'98). Одним словом, пользователи Mathcad худо-бедно научились строить булевы операторы и функции. Но тут разработчики спохватились и всторили их в Mathcad 2000: от панели (палитры) Evaluation “отпочковалась” новая панель Boolean (рис. 1), где к привычным кнопкам операторов сравнения числовых и текстовых констант (“равно”, “меньше”, “больше”, “меньше и равно”, “больше и равно” и “не равно”) добавились четыре новые кнопки булевых операторов: отрицание, логическое И (дизъюнкция), логическое ИЛИ (конъюнкция) и разделительная дизъюнкция.

Рис. 1 (01_boolean.bmp)

Эти новые операторы, по идее, должны иметь в качестве операндов булевы переменные, хранящие либо 1, либо 0. Возвращать эти операторы также должны булевы значения. Но разработчики Mathcad не учли тот факт, что пользователи могут “подсовывать” в качестве операндов и вещественные значения в диапазоне от нуля до единицы. Ведь, ответ на альтернативный вопрос может быть не только четким (“Да” или “Нет”), но и нечетким: “Скорее да, чем нет – 0.75, к примеру, “Скорее нет, чем да (0.25)” и т.д.

Рис. 2 (02_Not.bmp)

Рис.3 (02_And.bmp)

Пользовательские функции Not и And, формирование которых показано на рис. 2 и 3, “умеют” правильно работать не только с булевыми, но и с вещественными аргументами, реализуя нечеткую логику. Кроме того, наши пользовательские функции Not и And по отношению к встроенным аналогам имеют такие преимущества:

Как мы уже отметили, встроенных операторов сравнения в среде Mathcad шесть (=, , , ?, ? и ?). Но здесь не хватает седьмого оператора – “примерно равно”, который незаменим при численном решении задач.

Рис.4 (04_xor.bmp)

На рис. 4 этот пробел восполнен. Более того, оператор “примерно равно” позволяет нам построить оператор (функцию) “нечеткая разделительная дизъюнкция”.

Автор здесь, мягко говоря, не совсем четко изложил азы нечеткой логики (fuzzy logic). Но дело тут не только в этой модной теории. “Если звезды зажигаются, то это кому-то надо!” – если операнды встроенных операторов O , U , U и A могут иметь не только булевый, но и вещественный тип, то в этом должен быть какой-то смысл.

В начале статьи мы договорились, что три группы новинок Mathcad 2000 (качество, количество и “прибамбасы”) мы будем считать нечеткими множествами (fuzzy sets – еще одна модная теория). Булевы операторы Mathcad на 30% это новинка, на 50% – улучшение и на 20% – “прибамбас”. Читатель при желании здесь и далее может выставить свои оценки.

Быстрый трехмерный график

Обычная технология построения двумерного графика (декартова или полярного) состоит в предварительном создании двух векторов, элементы которых – значения аргумента и функции, соответственно. Построение трехмерного графика (поверхность, линии уровня и др.) предваряется заполнением матрицы, элементы которой – значения анализируемой двумерной функции.

Начиная с Mathcad 7, стало возможным строить двумерный график по так называемой “быстрой” технологии (Quick 2D-Plot), когда задается только вид анализируемой функции одного аргумента и сразу отдается команда на построение графика. При этом значения аргумента выставляются в диапазоне от минус 10 до плюс 10. Если это умолчание пользователя не устраивает, то он меняет эти числа прямо на графике, на оси аргумента.

В Mathcad 2000 дошла очередь (хорошего понемножку!) до “быстрой” технологии построения и трехмерных графиков – Quick Plot Data.

Рис. 5 (05_3D_Graph)

В среде Mathcad 2000 достаточно иметь только анализируемую функцию двух аргументов, чтобы сразу отобразить ее графически (рис. 5) без формирования пользователем дополнительной матрицы. По умолчанию “разброс” значений двух аргументов анализируемой функции (Range 1 и Range 2) задается в пределах от (start) минус 5 до (end) плюс 5, а число узлов разбиения сетки поверхности равно 20 по обоим координатам. Кроме того, в среде Mathcad 2000 стало возможным строить поверхность не только в прямоугольных координатах (Coordinate System – Cartesian – рис. 5), но и в сферических (Spherical) и цилиндрических (Cylindrical).

Надпись на графике и план выражения

Заканчивая тему новых графических возможностей Mathcad, следует отметить, что в среде Mathcad 2000 на графиках допустимо делать надписи (правда, непрозрачные). Для этого на свободном месте Mathcad-документа пишется простой текст (надпись), который затем перетаскивается в нужное место графика на передний план. В среде Mathcad 2000 через контекстное меню можно менять у выражения статус прозрачности, перемещая выражение либо на передний (Bring to Front), либо на задний план (Send to Back). Это позволило нам сделать, например, рис. 7 более компактным за счет того, что выражение с функцией Find находится на втором плане и не загораживает своей прямоугольной областью соседей. Команды Bring to Front и Send to Back замыкают контекстное меню оператора в том случае, если его область пересекается с областью другого оператора.

Новые функции

В среде Mathcad 2000 появились следующие финансовые функции (Financial):

  1. cnper(rate, pv, fv) the number of compounding periods required for an investment to yield a specified future value given a present value and an interest rate per period..
  2. crate(nper, pv, fv) the fixed interest rate per period required for an investment at present value to yield a specified future value over a number of compounding periods.
  3. cumint(rate, nper, pv, start, end, [type]) the cumulative interest paid on a loan between a starting period and an ending period given a fixed interest rate, the total number of compounding periods, and the present value of the loan..
  4. cumprn(rate, nper, pv, stall, end, [lype]) the cumulative principal paid on a loan between a starting period and an ending period given a fixed interest rate, the total number of compounding periods, and the present value of the loan..
  5. eff(rate, nper) the effective annual interest rate (APR), given the nominal interest rate and the number of compounding periods per year..
  6. fv(rate, nper, pmt, [[pv], [type]]) the future value of an investment or loan over a specified number of compounding periods given a periodic, constant payment and a fixed interest rate..
  7. fvadj(prin, v) the future value of an initial principal after applying a series of compound interest rates stored in vector v..
  8. fvc(rate, v) the future value of a list of cash flows occuring at regular intervals earning a specified interest rate..
  9. ipmt(rate, per, nper, pv, [[fv], [type]]) the interest payment of an investment or loan for a given period based on periodic, constant payments over a given number of compounding periods using a fixed interest rate and a specified present value..
  10. irr(v, [guess]) the internal rate of return for a series cash flows occurring at regular intervals..
  11. mirr(v, fin_rate, rein_rate) the modified internal rate of return for cash flows occuring at regular intervals given a finance rate payable on the cash flows you borrow and a reinvestment rate earned on the cash flows as you reinvest them.
  12. nom(rate, nper) the nominal interest rate, given the effective annual interest rate (APR) and the number of compounding periods per year.
  13. nper(rate, pmt, pv, [[fv], [type]]) the number of compounding periods for an investment or loan based on periodic, constant payments using a fixed interest rate and a specified present value..
  14. npv(rate, v) – net present value of an Investment by using a discount rate and series of cash flows.
  15. pmt(rate, nper, pv, [[fv], [type]]) – the payment for an investment or loan based on periodic, constant payments over a given number of compounding periods using a fixed interest rate and a specified present value..
  16. ppmt(rate, per, nper, pv, [[fv], [type]]) the payment on the principal of an investment or loan for a given period based on periodic, constant payments over a given number of compounding periods using a fixed interest rate and a specified present value..
  17. pv(rate, nper, pmt, [[fv], [type]]) the present value of an investment or loan based on periodic, constant payments over a given number of compounding periods using a fixed interest rate and a specified payment.
  18. rate(nper, pmt, pv, [[fv], [type], [guess]]) the interest rate per period of an investment or loan over a specified number of compounding periods given a periodic, constant payment and a specified present value.

Автор не стал переводить суть финансовых функций, т.к. не считает себя специалистом в этой области. Вот типичная задача, решаемая с помощью финансовых функций: “Иуда за свое предательство получил 30 серебряников и положил их на депозит под три процента годовых с ежемесячным (ежеквартальным или ежегодным) начислением процентов. Спрашивается, сколько денег у Иуды сегодня окажется в банке?” .

Mathcad по праву называют не просто математическим, а физико-математическим пакетом. Решая физическую задачу (школьную или институтскую задачу по физике, например), мы часто путаемся не в формулах (все формулы, лежащие в основе мироздания, просты – F = a? m, E = m? c2, 1 Кбайт = 1024 байта и т.д.) и не в расчетах (под рукой персональный компьютер или, на худой конец, калькулятор), а в размерностях. Мало того, что есть различные системы измерений (футы-метры) ? в рамках одной системы нет полного единообразия (метры-миллиметры, футы-дюймы).

Переменной в среде Mathcad можно присвоить не просто числовое значение, а значение с размерностью физической величины – встроенной или пользовательской:

G := 1 kg d := 1 см и т.д.

Но вот что интересно, ученый-физик спокойно скажет, что у него в кабинете лежит книга массой в один килограмм, толщиной в один сантиметр (см. выше) и стоимостью в один рубль, но допустить размерность валюты в систему измерений он (физик) никак не может.

Автор, тестируя уже третью бета-версию Mathcad (7, 8 и 2000), не устает напоминать разработчикам, что в списке встроенных размерностей (длина, время, масса, температура, сила тока, освещенность и количества вещества, если иметь в виду международную систему) необходимо иметь и стоимость. Было бы прекрасно, если встроенная финансовая функция возвращала не безразмерное число, а сумму с припечаткой названия нужной валюты (доллары, рубли, марки, франки и т.д.). Сейчас автор, ведя технико-экономические расчеты на Mathcad, выходит из этого положения по принципу “Время – деньги!”. На рис. 6 показано формирование и работа одной из “главных” финансовых функций – функции, возвращающей сумму подоходного налога.

Рис. 6 (06_tax.bmp)

В расчете налога единицы измерения времени не задействованы, и этим можно воспользоваться (“Время – деньги!”). Функция Налог по умолчанию возвращает величину налога, припечатывая к ней единицу времени:

Налог(300000 Руб) = 90400 sec ¦

Но в placeholder (¦) можно заносить другие размерности, встроенные или пользовательские, что мы и делаем, получая ответ либо в рублях, либо в долларах США (рис. 6).

Наши парламентарии считают, что в России налоги не собираются из-за плохой налоговой системы, в частности, из-за неправильных коэффициентов функции Налог. Но это иллюзия – невольная или специально муссируемая. Налоги у нас не платят в первую очередь из-за того, что люди не хотят отдавать свои деньги неизвестно на что. На больницы, школы денег не хватает, а губернатор N-ской области, где эти бедные больницы и школы расположены, еженедельно на своем личном самолете со своей многочисленной свитой летает в Москву. Когда ему говорят, что так делать нельзя, что бюджетные средства в первую очередь должны идти в социальную сферу, то он эти законные требования относит к разряду “дешевого популизма”. Президент страны, где задерживают даже нищенские пенсии, пособия и стипендии, содержит десяток загородных резиденций и тратит на евроремонт Кремлевского Дворца сотни миллионов долларов. Сами же налогоплательщики не желают иметь в качестве посредников таких нечестных людей и стараются отдавать деньги бюджетникам напрямую – собирают деньги на уборку класса, передают конверт с “благодарностью” врачу и т.д. Конечно, это порочная практика, но что делать, если люди, призванные распоряжаться нашими деньгами, не могут или не хотят сделать это умно и честно. Но мы немного отвлеклись от основной темы... Хотя, как сказать. Автор, работая в вузе не имеет средств на приобретение легальных копий программ и должен. К этой проблеме мы еще вернемся.

Интересные возможности при решении задач с размерностью валюты (и не только) предоставляет символьная математика Mathcad. Так при чтении романа Ф.М.Достоевского “Игрок” (http://www.online.ru/sp/eel/russian/Dostoevsky.Fedor/igrok.rhtml.) все время натыкаешься на рубли, флорины, гульдены, фридрихсдоры, франки, фунты, которыми оперируют герои романа. Возникает законный вопрос, много ли они выигрывали или проигрывали на рулетке, и какие курсы валют имели место во второй половине 19 века. Несложно из электронной версии романа выудить семь цитат, в которых зашифровано решение задачи:

Цитата 1

? Вы их немедленно получите, ? ответил генерал, покраснев немного, порылся у себя в бюро, справился в книжке, и оказалось, что за ним моих денег около ста двадцати рублей (здесь и далее курсив автора).

? Как же мы сосчитаемся, ? заговорил он, ? надо переводить на талеры. Да вот возьмите сто талеров, круглым счетом, ? остальное, конечно, не пропадет.

и далее

Вам следует дополучить с меня эти четыре фридрихсдора и три флорина на здешний расчет.

Цитата 2

Полина просто рассердилась, когда я передал ей всего только семьсот гульденов.

и далее

Слушайте и запомните: возьмите эти семьсот флоринов и ступайте играть, выиграйте мне на рулетке сколько можете больше; мне деньги во что бы ни стало теперь нужны.

Цитата 3

Я начал с того, что вынул пять фридрихсдоров, то есть пятьдесят гульденов, и поставил их на четку.

Цитата 4

? Да-с, вот взяла да и выиграла двенадцать тысяч флоринов! Какое двенадцать, а золото-то? С золотом почти что тринадцать выйдет. Это сколько по-нашему? Тысяч шесть, что ли, будет?

Я доложил, что и за семь перевалило, а по теперешнему курсу, пожалуй, и до восьми дойдет.

Цитата 5

? Oui, madame, ? вежливо подтвердил крупер, – равно как всякая единичная ставка не должна превышать разом четырех тысяч флоринов, по уставу, ? прибавил он в пояснение.

Я поставил самую большую позволенную ставку, в четыре тысячи гульденов, и проиграл.

Цитата 6

Ей проходилось получить ровно четыреста двадцать фридрихсдоров, то есть четыре тысячи флоринов и двадцать фридрихсдоров.

Цитата 7

– Полина, вот двадцать пять тысяч флоринов – это пятьдесят тысяч франков, даже больше.

Если эти цитаты перевести их на язык математики Mathcad, то вот что получится:

Рис.7. (07_gambler.bmp)

Из решения на рис. 7 видно, что во второй половине 19 века гульден стоил 61 копейки, талер – полтора гульдена (флорина – см. сноску 19), а фридрихсдор был в 10 раз дороже гульдена. При таком раскладе, генерал заплатил учителю (Алексею Ивановичу) 117 рублей 73 копейки (“около 120 рублей” – см. цитату 1), а “бабуленька” выиграла на рулетке 7930 рублей (“до восьми тысяч дойдет” – см. цитату 4).

Автор еще раз напоминает, что в этой статье не просто перечисляются новые возможности Mathcad 2000, а дается их критический разбор, а также высказываются пожелания разработчикам и просто даются комментарии, прямо не относящиеся к Mathcad. Если в Mathcad введены финансовые функции, то было бы неплохо предоставить пользователям возможность без хитростей (“Время – деньги!”) вводить дополнительные единицы измерения: рубли, штуки, человеко-часы и т.д. Можно, конечно, просто писать в Mathcad-документе Руб := 1 шт := 1 и т.д., но единицы измерения должны не только сопровождать исходные данные и ответ, но и участвовать в контроле размерностей.

В разделе нашей статьи о финансах оказалась функция пользователя Note(Sum) – см. рис. 8. Она возвращает расклад суммы денег (аргумент Sum) на российские банкноты и монеты. Эта функция оказалась здесь не только потому, что она “финансовая”, но и по другой важной причине.

Рис. 8 (08_money.bmp)

Очень часто, ставя на компьютер новую версию программы, пользователь сталкивается с проблемой, которую хорошо иллюстрирует пословица “Лучшее – враг хорошего!”. В старой версии задача решается, а в новой возникают непонятные сбои. Такая история случилась и с нашей функцией Note(Sum). Она прекрасно работает в среде Mathcad 7 Pro, в среде Mathcad 8 Pro при некоторых дробных значениях аргумента дает сбои, а в среде Mathcad 2000 всегда аварийно прерывается, если сумма денег – величина нецелая (с копейками). Но “нет худа без добра” – ошибка в программе на рис. 8 дает нам прекрасную возможность рассказать о ключевой новинке Mathcad 2000 – об инструменте трассировки (локализации) ошибки.

Вот типичная Mathcad-ситуация – пользователь пытается вывести значение пользовательской функции, в которую вложена другая функция, а в нее третья и т.д. Другой сценарий: пользователь выводит на дисплей значение функции, созданной средствами программирования (см. рис. 8). При возникновении ошибки “краснеет” только “крайний” оператор, что очень затрудняет отладку Mathcad-документа. В среде Mathcad 2000 контекстное меню аварийного (“покрасневшего от стыда” за ошибку) оператора начинается с команды Trace Error, выполнение которой вызывает на дисплей одноименное диалоговое окно с пятью кнопками: First – переход к “истоку” ошибки, Previous – переход к предыдущему аварийному оператору, Next – переход к следующему аварийному оператору, Last – переход к “устью” ошибки (не к виновнику сбоя, а, так сказать к “козлу отпущения”) и Close – закрытие окна трассировки.

На рис. 8 при попытке узнать, на какие банкноты и монеты раскладываются семьсот семьдесят семь рублей и семьдесят семь копеек произошел сбой с таким сообщением об ошибке: “Значение индекса вышло за дозволенные рамки”. С помощью инструмента Trace Error этот индекс был локализован – он в теле программы покраснел и стал охвачен синим “крючком” редактора. Правда, очень жаль, что Mathcad 2000 не показывает конкретное значение аварийного индекса и приходится догадываться самому, чему он равен.

Контроль размерностей физических величин

В восьмой (предыдущей по отношению к Mathcad 2000) версии Mathcad появились функции контроля типа переменной: IsArray, IsScalar и IsString, возвращающие единицу, если аргумент функций – массив (вектор или матрица), скаляр или текст, соответственно. В среду Mathcad 2000 введена еще одна подобная функция UnitsOf; переводящую контроль переменных из области математики в область физики: функция UnitsOf возвращает размерность переменной-аргумента.

Рис.9 (09_units.bmp)

Опытные пользователи Mathcad еще до появления функций IsArray, IsScalar, IsString и UnitsOf научились решать данную проблему. Во-первых, считается плохим тоном, когда переменная “гуляет сама по себе” – имеет в разных местах программы разный тип и разную размерность. Программист должен держать переменные “на коротком поводке” – должен четко знать, что она хранит сейчас и может хранить в будущем. Во-вторых, с контролем типа переменной и ее размерности прекрасно справляется оператор обработки ошибки on error.

Основная работа функции UnitsOf видится в решении такой проблемы. Пользователя, например, просят с помощью оператора d := g ввести не просто величину, а величину с размерностью длины, например. Функция UnitsOf здесь будет полезна. Но с ней фирма MathSoft несколько опоздала – “голь на выдумки хитра”: на рис. 9 показано, как можно организовать контроль размерностей и без функции UnitsOf.

Новая методика решения дифференциальных уравнений

Разработчики Mathcad, вводя в него новый инструмент решения задачи, думают не только о точности и о быстродействии новой функции, оператора или команды меню, но и о наглядности, открытости алгоритма для изучения. Научно-техническая задача очень часто сводится к дилемме “дано – найти”. Решение системы алгебраических уравнений “втискивается” в шаблон “Given – Find” – см. рис 7.

Инструменты решения обыкновенных дифференциальных уравнений (ОДУ) и их систем появились в пятой версии Mathcad:

Но эти функции возвращали не решение ОДУ (выражение, подстановка которого в исходное дифференциальное уравнение превращало бы его в тождество), а вектор или матрицу с дискретными значениями искомого выражения. Эти значения приходилось интерполировать (с помощью сплайна, например), чтобы получить выражение (функцию) с корнями, максимумами, производными и т.д.

Особые неудобства доставляли две функции (bvalifit и sbval) для решения краевой задачи. Эта задача сама по себе довольно сложная, а вдобавок механизм реализации решения в среде Mathcad довольно запутанный. Автор, честно говоря, в нем так до конца и не разобрался, имитируя на лекциях перед студентами его знание.

Исправляя этот недостаток, разработчики вставили в Mathcad 2000 новую функцию odesolve (ordinary differential equation solve), работающую как и функции Find, MinErr, Minimize и Maximize в паре с ключевым словом Given.

Теперь запись решения задачи Коши и краевой задачи вполне естественна: пишется ключевое слово Given (дано), затем дифференциальное уравнение и начальные условия (см. рис. 10). Функция odesolve, завершающая эту конструкцию, возвращает функцию – решение задачи. У этой функции нельзя просмотреть ее аналитический вид4, но тем не менее, это полноценная Mathcad-функция пользователя, которую можно протабулировать, построить график, найти у нее особые точки – корни, минимум, максимум…

Рис.10 (10_bridge.bmp)

У функции odesolve две опции:

Поиск корня в интервале

В среде Mathcad 2000 изменилась работа встроенной функции root. Теперь эта функция может иметь либо два, либо четыре аргумента. Два аргумента означают старое содержание этой функции – поиск корня уравнения с опорой на начальное приближение, а четыре – поиск корня в заданном интервале.

Рис. 11 (11_root.bmp)

На рис. 11 “двухаргументная” функция root дает сбои, а “четырехаргументная” – нет.

Изменения коснулись и некоторых других встроенных функций. Пример – функция mean. Она возвращает среднее арифметическое значение элементов вектора или матрицы. В среде Mathcad 2000 функция mean может иметь переменное число аргументов. Так конструкция mean(A, B, C, 1.24) предназначена для поиска среднего арифметического трех массивов (A, B, C) и одной константы (1.24). Раньше для этого следовало писать mean(mean (A) mean(B) mean(C) 1.24).

С самой ранней версии Mathcad в эту математическую программу были встроены две функции (solve и intercept), предназначенные для сглаживания точек прямой линией методом наименьших квадратов. В Mathcad 6.0 были добавлены две функции с окончанием fit (fitting – сглаживание) – linfit и genfit, решающие более сложные задачи: сглаживающая функция теперь могла иметь не только линейный (a+bx), но и другой вид. В среде Mathcad 2000 набор функций с окончанием fit увеличился:

  1. expfit(vx, vy, vg) возвращает вектор, содержащий коэффициенты (a, b и c) сглаживающего выражения вида a*e^(b*x)+c, которое лучшим образом приближается к точкам, координаты которыхвекторы vx и vy. Вектор vg содержит первое приближение к решению.
  2. lgsfit(vx, vy, vg) тоже для выражения a/(1+b*e^(-c*x)).
  3. logfit(vx, vy) тоже для выражения a*ln(x+b)+c. Начального приближения не требуется.
  4. medfit(vx, vy) тоже для выражения a+bx. Начального приближения не требуется.
  5. pwrfit(vx, vy, vg) тоже для выражения a*x^b+c. Вектор vg содержит первое приближение к решению.
  6. sinfit(vx, vy, vg) тоже для выражения a*sin(x+b)+c.

Но, честно говоря, ввод в Mathcad 2000 этих новых шести функций – это явная перегрузка пакета. Во-первых, сглаживающих функций намного больше чем, предложенных разработчикам Mathcad. Во-вторых, с этой оптимизационной задачей прекрасно справляется функция Minimize. При этом задача остается открытой для изучения и для совершенствования.

 

Основные операторы интерфейса

В среде Mathcad оператор “:=” является основным, поддерживающим интерфейс пользователя с этой математической программой. С его помощью переменным присваиваются числовые значения и определяются функции пользователя: А := 20, y(x) := х2 и т.д. Этот же оператор имеет аналогичное написание и действие в среде языка Pascal. В других языках программирования (BASIC, например) пользовательские переменные и функции “рождаются” и обновляются с помощью оператора “=”: А = 20, y(x) = x^2 и т.д. Но в среде Mathcad оператор “=” является как бы антонимом оператора “:=” – оператор “=” предназначен не для ввода, а для вывода численного значения переменной, выражения, функции.

Язык Pascal все более и более теряет свои позиции, уступая лидерство языкам С и BASIC. В следствие этого оператор “:=” становился неким анахронизмом, и его нужно было заменить на более привычный оператор “=”. Но он в среде Mathcad, как уже отмечено выше, с самого начала был “мобилизован” на выполнение противоположной операции не на ввод, а на вывод численного значения переменной.

Фирма MathSoft пытается разрешить это противоречие. Так, начиная с Mathcad 7, операторы “:=” и “=” несколько “перемешались” благодаря так называемой технологии SmartOperator (“сообразительный” оператор). При вводе значения переменной теперь следует набирать на клавиатуре не “А:” (символ “=” система припечатывает сама), а “А=”. Если переменная А что-то уже хранит, то это “что-то” (встроенное или пользовательское значение) выводится на дисплей: А=20. Если же переменная А свободна, то на дисплее появляется заготовка оператора “загрузки” переменной: А:=< . Черный квадрат (placeholder – “держатель места”) пользователь заполняет выражением, содержащим константы, а также переменные и функции, видимые в данном месте Mathcad-документа.

Кроме оператора “:=” в среде Mathcad есть и два других оператора аналогичных по действию, но отличающихся, если так можно выразиться, по радиусу действия. Оператор “? ” (Triple equal – тройное “равно”) делает пользовательскую переменную или функцию видимой во всем Mathcad-документе (оператор “:=” делает переменную и функцию видимой только ниже и правее места ее создания), а операто𠓬 ” (Left Arrow – левая стрелка) – внутри программного блока (это переменные S, PS, i и Note, если вернуться к рис. 8) ниже данного оператора. Эти три оператора ввода позволяют создавать глобальные “? ”, полуглобальные (или полулокальные) “:=” и локальные “¬ ” переменные. У оператора “=” тоже есть “помощник” – оператор вывода аналитического (символьного) значения переменной или функции® ” (Right Arrow – правая стрелка). С появлением 2000-й версии “все смешалось в доме Mathcad”. Теперь пользователь вправе менять в выражениях написание основных интерфейсных операторов по такой схеме:

Оператор

Варианты написания

Глобальное присваивание

?

=

Полуглобальное присваивание

:=

=

Локальное присваивание

¬

=

“равно”

= (жирное равно)

= (бледное равно)

Такую замену написания операторов можно провести локально (только у одного оператора) либо глобально – во всех операторах. Локальная замена ведется через контекстное меню (нажатие правой кнопкой мыши на выражении), где появилась новая команда View Definition As: было А? 3 стало А=3, было B:=1+2 стало B=1+2, было C¬ A+B стало C=A+B, было if C=A стало if C=A.

Глобальная же замена написаний операторов ведется через дополнительный ярлык Display диалогового окна Math Options, вызываемо командой Options… меню Math:

Рис. 12 (12_symbol.bmp)

Теперь пользователь Mathcad имеет прекрасную возможность писать такие “ребусы”:

А = 1 A = 1 A = 1

где первый оператор – это оператор присваивания (локального, полуглобального или глобального – догадайся сам!), второй – вывод численного значения переменной, а третий – оператор сравнения переменной с единицей. “How is how” можно понять, только подведя курсор к выражению – см. рис.11, где фрагмент Mathcad-документа продублирован. В первом дубле все операторы прописаны как “бледное равно”. Если ко второму дублю подвести курсор (для редактирования, например), то это действие заставит операторы принять их “первородный” вид.

Фирма MathSoft данную особенность называет главной новинкой 2000-й версии. По крайней мере, эта позиция стоит первой в списке новых возможностей Mathcad 2000. Автор же считает ввод операторов-трансформеров чистым “прибамбасом”. Было бы намного логичнее, не обижая язык Pascal – прародитель Mathcad , вести замену символов по такой схеме:

Оператор

Варианты написания

Глобальное присваивание

?

:=

Полуглобальное присваивание

:=

:=

Локальное присваивание

¬

:=

Вывод численного значения

=

®

Вывод аналитического значения

®

=

Равно

=

= = (как в языке C)

Форматирование результата

Говоря об операторе “=” – об операторе вывода численного значения переменной, выражения или функции, следует отметить, что в среде Mathcad 2000 появились новые возможности для форматирования ответа:

Рис.13 (13_format_N.bmp)

Теперь мантисса и порядок числа могут разделятся и “андреевским крестом”, добавилась “фортрановская” форма записи вещественного числа с двойной точностью 1.111+E111, например.

Три английских языка

В “письме” на фирму MathSoft (“на деревню дедушке”), которое автор поместил в качестве эпиграфа, текстовый процессор Word, на котором писалась статья, узрел одну ошибку – надо писать realized вместо realised. В то время как английские и американские филологи спорят, что правильнее и красивее, фирма MathSoft позволила пользователям решать эту проблему самим. По умолчанию Spell Check ориентирован на американский диалект английского языка – см. диалоговое окно Preferences, вызываемое из меню Edit (рис. 14).

Рис.14 (14_Tree_lang.bmp)

При желании диалект, на котором “говорит” Mathcad 2000, допустимо сменить на два поддиалекта “британского” английского – можно писать optimize, а можно optimise. Российского пользователя это нововведение должно мало волновать. От отечественного же пользователя можно услышать такие, примерно, суждения: “Зачем MathSoft вводит в Mathcad проверку орфографии?! Намного лучше скопировать текст комментария Word и уже там проверять русскую или английскую не только орфографию, но и грамматику; там же можно подобрать новые термины-синонимы и др.”. Другое высказывание: “Зачем улучшать в Mathcad средства ввода и вывода матриц?! Проще и лучше внедрять в Mathcad-документ таблицу Excel?!”. И далее: “Зачем вводить в Mathcad новые функции и совершенствовать существующие, когда числовые данные можно перекачать в среду MatLab и уже там поработать с ними?!”. При этом как-то упускаются из виду, что западный пользователь покупает и ставит на свой компьютер программу, а отечественный, как правило, ставит не покупая (вернее, покупая на “Горбушке” “черный” диск). Мы не будем выяснять сейчас, беда ли это или вина наших пользователей, а отметим лишь вот что. Часто можно услышать, что Mathcad намного слабее, чем MatLab, и непонятно почему “глупые людишки” работают с первым пакетом, а не со вторым. Да, мерседес намного лучше фольксвагена, форда, и тем более жигулей, но люди разъезжают, в основном, не на лимузинах, а на “рабочих лошадках”. Понять “границы ареала” Mathcad, MatLab и других подобных пакетов можно, вспомнив, что первый дешевле второго на порядок. Многое еще зависит и оттого, в каких руках – умелых или неумелых, находится автомобиль или математическая программа.

Линейка форматирования документа

Пакет Mathcad, как подчеркивают его разработчики, ведет свою родословную от табличного процессора. Одно из отличий Mathcad-документа от электронной таблицы состоит в том, что информация в таблице расположена строго по столбцам и строкам, операторы же Mathcad – в произвольном порядке. Это максимально приближает стиль записи в среде Mathcad к записи на обычном листе бумаги. Это, в свою очередь, определяет одну из главных причин популярности Mathcad в сфере образования. Дело в том, что Mathcad-документ можно спокойно отдавать на проверку преподавателю, совершенно незнакомому с компьютерными технологиями решения задачи. Чего не скажешь о протоколах, созданных в среде MatLab или с помощью традиционных языков программирования.

Но эта “произвольность” нередко мешает аккуратному оформлению Mathcad-документа. В среде Mathcad 2000 выстроить операторы столбиком, соблюдая нужные отступы, и даже сгруппировать их в таблицу поможет, так называемая, линейка (Ruler), вызываемая из меню View. Она схожа с линейкой Word’a и не требует особых объяснений.

Новые символы умножения и деления

Стремление к схожести Mathcad-документов с математическими выкладками на обычном листе бумаги заставляет разработчиков Mathcad экспериментировать с оператором умножения. Вернее, с символом оператора умножения. Если в среде Mathcad константа перемножается на переменную, то знака умножения “? ” между ними можно не ставить: p , 30 кг и т.д. В среде Mathcad символов умножения стало еще больше. В произведении теперь допустимо локально или глобально (рис. 15) ставить любой символ умножения из шести встроенных. А можно использовать и седьмой – см. ниже рис. 16.

Рис. 15 (15_Mult.bmp)

Двойник появился и у символа оператора деления. В среде Mathcad числитель и знаменатель располагаются друг под другом, отделяясь горизонтальной чертой. Так мы научены писать простые дроби еще со школьной скамьи. Но если дробь многоэтажная, то в ней человеку несложно и запутаться, отыскивая числители и знаменатели. В среде Mathcad 2000 пользователь теперь может аккордом “Ctrl+/” ввести в расчет новый символ оператора деления “? ”, размещая числитель и знаменатель на одном уровне и заключая их при необходимости в скобки – рис. 16.

Рис.16 (16_div.bmp)

На рис. 16 показана также технология ввода в Mathcad-документ пользовательских символов основных арифметических операторов, дублирующих встроенные символы (сложить и вычесть), ввода новых символов (умножить, поделить, возвести в степень и извлечь квадратный корень). Пользовательские символы позволяют в среде Mathcad писать программы с нотацией языка BASIC, например, или строить древовидные операторы с арифметическими действиями.

Автор благодарит Стива Финча (Steven Finch) и Роба Дули (Rob Dooly) – сотрудников MathSoft, Inc. за помощь в подготовке статьи.

Сам Mathcad 2000 можно приобрести на фирме СофтЛайн – у официального представителя MathSoft в России: (095) 232-00-23, www.softline.ru.